.data
	inputreader: .string "%d"
	inputvalue: .long 0
	readCount: .long 0

	question: .string "Warte aus Eingabe:\n"
	info: .string "Durchschnitt: %d\n"
	resultbuffer: .long 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

.text
.global main
main:

movl $0, %edi // destination index auf anfang setzen

.startRead:
// readcounter erhoehen
movl readCount, %eax
incl %eax
movl %eax, readCount

pushl $question
call printf
addl $4, %esp

//1. einlesen
pushl $inputvalue
pushl $inputreader
call scanf
addl $8, %esp


// call calculation
movl inputvalue, %eax
pushl %eax
subl $4, %esp // platz fuer uebergabe
call calculation
popl %eax // rueckgabe nach eax popen
addl $4, %esp


movl %eax, resultbuffer(, %edi, 4)
incl %edi


cmpl $10, readCount
jl .startRead

/* call avg
 * Keine Register werde bei der uebergabe benoetigt.
 * Es wird die adresse des arrays und die laenge als parameter uebergeben.
 * Die Rueckgabe erfolg als parameter
 */
pushl $resultbuffer
pushl readCount
subl $4, %esp
call avg
popl %eax //ergebnis in %eax speichern

// register sichern, eax ausgeben und register wiederherstellen
pushl %eax
pushl %ecx
pushl %edx
pushl %eax
pushl $info
call printf
addl $8, %esp
popl %edx
popl %ecx
popl %eax

movl $1, %eax
int $0x80 // exit programm



.global calculation
calculation:
pushl %ebp
movl %esp, %ebp
// x^2 + 2x - 2
movl 12(%ebp), %eax
//x^2
cltd
imull %eax
pushl %eax
//2x
movl 12(%ebp), %eax
movl $2, %ecx
cltd
imull %ecx
// x^2 + 2x
popl %ecx
addl %ecx, %eax
// x^2 + 2x -2
subl $2, %eax
// %eax an ausgabe
movl %eax, 8(%ebp)

leave
ret





.global avg
avg:
pushl %ebp
movl %esp, %ebp
// 8(%ebp) // rueckgabe
// 12(%ebp) // count
// 16(%ebp) // array adresse

pushl %ebx // %ebx sichern
movl 16(%ebp), %ebx // adresse des arrays auf %ebx sichern

movl $0, %eax // eax initialisieren
movl 12(%ebp), %ecx // counter initialisieren

.condition:
decl %ecx // ecx runterzaehlen
cmpl $0, %ecx
jl .end // wenn kleiner als 0 dann ans ende
leal (%ebx, %ecx, 4), %edx // adresse des gewaehlten array werts in eax
addl (%edx), %eax // wert aus edx auf eax aufaddieren
jp .condition


.end:
cltd
idivl 12(%ebp) // division

popl %ebx // %ebx wiederherstellen
movl %eax, 8(%ebp) // %eax in return speichern
leave
ret
